﻿#ifndef DELEGATE_H
#define DELEGATE_H

#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QTimer>

/**
 * @brief 大数据模型类
 * 用于处理大量数据的表格模型，实现了数据懒加载和动态更新功能
 */
class BigDataModel : public QStandardItemModel
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param rows 行数，默认100000行
     * @param cols 列数，默认5列
     * @param parent 父对象
     */
    BigDataModel(int rows = 100000, int cols = 5, QObject *parent = nullptr);

    /**
     * @brief 获取数据
     * @param index 数据索引
     * @param role 数据角色
     * @return 数据值
     */
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    /**
     * @brief 设置可见范围
     * @param start 起始行
     * @param end 结束行
     */
    void setVisibleRange(int start, int end);

    /**
     * @brief 启用/禁用自动更新
     * @param enable 是否启用
     */
    void setDynamicUpdates(bool enable);

public slots:
    /**
     * @brief 更新随机数据
     */
    void updateRandomData();

private:
    /**
     * @brief 加载行数据
     * @param row 行号
     */
    void loadRowData(int row) const;

    mutable int m_visibleStart = 0;           // 可见区域起始行
    mutable int m_visibleEnd = 20;            // 可见区域结束行
    mutable QHash<int, bool> m_loadedRows;    // 已加载行的标记
    mutable QVector<QVector<QVariant>> m_rowDataCache; // 行数据缓存
    QTimer* m_updateTimer;                    // 更新定时器
    bool m_dynamicEnabled = true;             // 是否启用动态更新
};

/**
 * @brief 进度条代理类
 * 用于在表格中显示进度条
 */
class ProgressBarDelegate : public QStyledItemDelegate
{
public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit ProgressBarDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    /**
     * @brief 绘制进度条
     * @param painter 绘图工具
     * @param option 选项
     * @param index 索引
     */
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override;
};

/**
 * @brief 星级评分代理类
 * 用于在表格中显示星级评分
 */
class StarRatingDelegate : public QStyledItemDelegate
{
public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit StarRatingDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    /**
     * @brief 绘制星级评分
     * @param painter 绘图工具
     * @param option 选项
     * @param index 索引
     */
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override;
};


#endif // TABLEVIEW_DEMO_H

class ProgressBarDelegate : public QStyledItemDelegate
{
public:
    explicit ProgressBarDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override;
};

class StarRatingDelegate : public QStyledItemDelegate
{
public:
    explicit StarRatingDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override;
};


#endif // TABLEVIEW_DEMO_H
